package com.example.emos.wx.config.shiro;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component//将类注入到Spring容器中
@Slf4j
public class JwtUtil {
    @Value("${emos.jwt.secret}")
    private String secret;
    @Value("${emos.jwt.expire}")
    private int expire;

    public String createToken(int userId) {
        Date date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, 5);//计算具体过期时间
        Algorithm algorithm = Algorithm.HMAC256(secret);// 密钥封装成一个加密算法对象
        JWTCreator.Builder builder = com.auth0.jwt.JWT.create();// 创建一个内部类对象
        String token = builder.withClaim("userId", userId).withExpiresAt(date).sign(algorithm);//通过对象，绑定数据，设置过期时间，生成token
        return token;
    }

    //从令牌里获得userId
    public int getUserId(String token) {
        DecodedJWT jwt = JWT.decode(token);
        int userId = jwt.getClaim("userId").asInt();
        return userId;
    }

    //验证令牌
    public void verifierToken(String token) {//参数是要传入的令牌字符串
        Algorithm algorithm = Algorithm.HMAC256(secret);//创建一个算法对象，验证有效性
        JWTVerifier verifier = JWT.require(algorithm).build();//创建一个验证对象
        verifier.verify(token);//拿密钥和令牌进行验证，token是不是那密钥进行加密的，还有过期没，否则抛出异常

    }
}


